<?php

class Application_Model_Iscriziones extends Zend_Db_Table_Abstract
{
    protected $_name = 'iscriziones';
    protected $_rowClass = 'Application_Model_Iscrizione';
    protected $_referenceMap = array(
        'Users' => array(
            'columns'       => array('user_userId'),
            'refTableClass' => 'Application_Model_Users',
            'refColumns'    => 'userId'
        ),
        'Eventos' => array(
            'columns'       => array('evento_evId'),
            'refTableClass' => 'Application_Model_Eventos',
            'refColumns'    => 'evId'
        )
    );
    
    /**
     * Create an Iscrizione
     * 
     * @param int $userId
     * @param int $eventoId
     * @param int $nPartecipanti
     * @return Zend_Db_Table_Row
     * @throws Zend_Exception
     */
    public function createIscrizione($userId, $eventoId, $nPartecipanti)
    {
        try {
            $rowIscrizione = $this->createRow();
            if ($rowIscrizione) {
                $rowIscrizione->user_userId = $userId;
                $rowIscrizione->evento_evId = $eventoId;
                $rowIscrizione->nPartecipanti = $nPartecipanti;

                $rowIscrizione->save();

                return $rowIscrizione;
            }
        } catch (Zend_Db_Statement_Exception $e) {
                $code = $e->getCode();
                if ($code == 23000) {
                    echo "<p class=\"alert\">Sei già iscritto a questo evento!</p>";
                } else {
                    throw new Zend_Exception("Non è possibile creare una nuova iscrizione");
                }
        }

    }
    
    /**
     * Get all iscriziones
     * 
     * @return Zend_Db_Table_Rowset
     */
    public function getAllIscriziones()
    {
        return $this->fetchAll();
    }
    
    /**
     * Get iscriziones of actifs eventos
     * 
     * @return Zend_Db_Table_Rowset
     */
    public function getActivesIscriziones()
    {
        $select = $this->select()
                       ->setIntegrityCheck(FALSE)
                       ->from(array('i' =>'iscriziones'))
                       ->join(array('e' => 'eventos',), 
                              'i.evento_evId = e.evId && e.evDataInizio >= NOW()',
                               array('i.user_userId', 'i.evento_evId', 'i.nPartecipanti',
                                   'e.evTitolo', 'e.evDataInizio', 'e.evIdent'))
                       ->join(array('u' => 'users'), 
                               'i.user_userId = u.userId',
                               array('u.userId', 'u.userNome', 'u.userEmail'));
        return $this->fetchAll($select);  
    }
    
    /**
     * Get a joined table of "iscriziones + users + eventos" by userId.
     * if ($id == 0) then get all iscriziones.
     * 
     * ATT:
     * Il problema di questo è che non si tratta di una model di iscriziones
     * ma di una model composta dall'unione di tre tabelle "iscriziones + users + eventos"
     * 
     * @param int $id if ($id == 0) then get all iscriziones 
     * @param string $dateOrder
     * @return Zend_Db_Table_Rowset
     */
    public function getIscrizionesByUserId($id = 0, $dateOrder = 'DESC') 
    {
        if ($id == 0) {
            $select = $this->select()
                           ->setIntegrityCheck(FALSE)
                           ->from(array('i' =>'iscriziones'))
                           ->join(array('e' => 'eventos',), 
                                   'i.evento_evId = e.evId',
                                    array('i.user_userId', 'i.evento_evId', 'i.nPartecipanti',
                                        'e.evTitolo', 'e.evDataInizio', 'e.evIdent'))
                           ->join(array('u' => 'users'), 
                                    'i.user_userId = u.userId',
                                    array('u.userId', 'u.userNome', 'u.userEmail'))
                           ->order('e.evDataInizio ' . $dateOrder);
            return $this->fetchAll($select);
        } else {
            $select = $this->select()
                           ->setIntegrityCheck(FALSE)
                           ->from(array('i' =>'iscriziones'))
                           ->join(array('e' => 'eventos',), 
                                   'i.evento_evId = e.evId',
                                    array('i.user_userId', 'i.evento_evId', 'i.nPartecipanti',
                                        'e.evTitolo', 'e.evDataInizio', 'e.evIdent'))
                           ->join(array('u' => 'users'), 
                                    'i.user_userId = u.userId',
                                    array('u.userId', 'u.userNome', 'u.userEmail'))
                           ->where('i.user_userId = ?', $id)
                           ->order('e.evDataInizio ' . $dateOrder);
            return $this->fetchAll($select);            
        }
    }
    
    /**
     * Create array o names for select elements for UserFilterForm 
     * 
     * @return array of names
     */
    public function createArrayUserNames()
    {
        $joinedTables = $this->getIscrizionesByUserId();
        
        $arrayOfNames = array();
        foreach ($joinedTables as $joinedTable) {
            $arrayOfNames["$joinedTable->userId"] = $joinedTable->userNome;
        }
        
        return $arrayOfNames;
    }
}